package Algorithm.Array.SpiralMatrix;

/**
 * @ClassName SpiralMatrix
 * @Description TODO: LEETCODE.59 给你一个正整数 n ，生成一个包含 1 到 n2 所有元素，且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
 * @Author ykeezy
 * @Date 2024/6/27 20:00
 */

public class SpiralMatrix {
    public static void main(String[] args) {
        int[][] spiralMatrix = generateMatrix(6);
        for (int row = 0; row < spiralMatrix.length; row++) {
            for (int column = 0; column < spiralMatrix[row].length; column++) {
                System.out.print(spiralMatrix[row][column] + " ");

            }

            System.out.println();

        }

    }

    public static int[][] generateMatrix(int n) {
        //先不谈矩阵内容的顺序，先确定矩阵的大小,n是多少，结果就是n行n列的二维数组
        //使用顺时针转圈的方式填充数组，则我们需要知道要转多少圈：
        //  循环一圈会走最上层的行和最下层的行，完成螺旋矩阵意味着这样对称的走完了n行，又因为每次走两行，所以走的次数为n/2
        //  如果n为奇数，则会走完n/2次循环后剩余最中间的一块n平方的位置还没有填充，单独判断n的奇偶性即可(想想n == 3的情况就知道了)
        //每次填充数据顺序——每次都从当前行、列的第一个遍历到倒数第二个
        //这题的关键就是边界条件和offset的设计

        // 上[0][0] ... [0][n-2]
        // 右[0][n-1] ... [n-2][n-1]
        // 下[n-1][n-1] ... [n-1][1]
        // 左[n-1][0] ... [1][1]
        int[][] spiralMatrix = new int[n][n];
        int number = 1;
        int times = 0;
        int startX = 0;
        int startY = 0;
        //偏移量
        int offset = 1;
        int x = 0;
        int y = 0;
        while(times < n/2){
            x = startX;
            y = startY;
            for (;x < n - offset; x++) {
                spiralMatrix[y][x] = number++;

            }

            for (;y < n - offset; y++) {
                spiralMatrix[y][x] = number++;

            }

            for (;x >= offset; x--) {
                spiralMatrix[y][x] = number++;

            }

            for (;y >= offset ; y--) {
                spiralMatrix[y][x] = number++;

            }

            offset += 1;
            startX = x + 1;
            startY = y + 1;
            times++;

        }

        if (n % 2 == 1){
            spiralMatrix[n/2][n/2] = n * n;

        }

        return spiralMatrix;

    }
}
